package com.newshub.business.mapper;

import com.newshub.business.entity.Source;
import com.newshub.business.dto.SourceQueryDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 新闻来源Mapper接口
 */
@Mapper
public interface SourceMapper {
    
    /**
     * 根据ID查询来源
     */
    Source selectById(@Param("id") Integer id);
    
    /**
     * 插入来源
     */
    int insert(Source source);
    
    /**
     * 根据ID删除来源
     */
    int deleteById(@Param("id") Integer id);
    
    /**
     * 根据ID更新来源
     */
    int updateById(Source source);
    
    /**
     * 根据名称查询新闻来源
     * @param name 来源名称
     * @return 新闻来源对象
     */
    Source selectByName(@Param("name") String name);
    
    /**
     * 根据区域ID查询新闻来源
     * @param regionId 区域ID
     * @return 新闻来源列表
     */
    List<Source> selectByRegionId(@Param("regionId") Integer regionId);
    
    /**
     * 查询所有新闻来源
     * @return 新闻来源列表
     */
    List<Source> selectAllSources();
    
    /**
     * 批量插入新闻来源
     * @param sources 新闻来源列表
     * @return 插入数量
     */
    int insertBatch(@Param("sources") List<Source> sources);
    
    /**
     * 根据ID删除新闻来源
     * @param id 来源ID
     * @return 删除数量
     */
    int deleteByIdCustom(@Param("id") Integer id);
    
    /**
     * 更新新闻来源信息
     * @param source 新闻来源对象
     * @return 更新数量
     */
    int updateSourceInfo(Source source);
    
    /**
     * 根据区域名称查询新闻来源
     * @param regionName 区域名称
     * @return 新闻来源列表
     */
    List<Source> selectByRegionName(@Param("regionName") String regionName);
    
    /**
     * 根据ID更新新闻来源信息
     * @param id 来源ID
     * @param name 来源名称
     * @param homepage 主页链接
     * @param regionId 区域ID
     * @param regionName 区域名称
     * @return 更新数量
     */
    int updateSourceById(@Param("id") Integer id, @Param("name") String name, 
                        @Param("homepage") String homepage, @Param("regionId") int regionId, 
                        @Param("regionName") String regionName);

    /**
     * 分页查询新闻源
     * @param queryDTO 查询条件
     * @return 新闻源列表
     */
    List<Source> selectByPage(SourceQueryDTO queryDTO);

    /**
     * 统计分页查询的总数
     * @param queryDTO 查询条件
     * @return 总数
     */
    long countByPage(SourceQueryDTO queryDTO);

    /**
     * 根据代码查询新闻源
     * @param code 新闻源代码
     * @return 新闻源对象
     */
    Source selectByCode(@Param("code") String code);

    /**
     * 更新状态
     * @param id 新闻源ID
     * @param status 新状态
     * @return 更新数量
     */
    int updateStatusById(@Param("id") Integer id, @Param("status") Integer status);

    /**
     * 批量删除
     * @param ids 新闻源ID列表
     * @return 删除数量
     */
    int deleteBatchByIds(@Param("ids") List<Integer> ids);

    // ==================== 统计功能 ====================
    
    /**
     * 统计各信源的新闻数量分布
     * @return 信源分布统计
     */
    List<Map<String, Object>> selectSourceDistribution();
}